from flask import current_app
from itsdangerous import TimedJSONWebSignatureSerializer  # itsdangerous 这个库是使用hash来生成token的

from comment.models.user import User
from comment.utils.const import SECRET_KEY, JWT_EXPIRY_SECOND


def generate_token(uid):
    '''
    根据已经登陆之后的用户ID生成token
    :param uid: 用户ID
    :return:
    '''
    # 要传两个参数，参数一：秘钥，参数二：token有效时间    。秘钥的作用是防止黑客通过逆向解析hash值得到userid。hash可以逆向解析获取值，但是在其中加入一个秘钥，只要秘钥不泄露，几乎不可能破解到原值。
    s = TimedJSONWebSignatureSerializer(secret_key=SECRET_KEY, expires_in=JWT_EXPIRY_SECOND)
    # 生成token
    return s.dumps({'id': uid}).decode()  # s.dumps({'id': uid})生成的是一个二进制数据，需要解码成字符串


def verify_tokens(token_str):
    '''
    验证token,并且验证之后返回用户ID
    :param token_str:
    :return:
    '''
    s = TimedJSONWebSignatureSerializer(secret_key=SECRET_KEY)
    try:
        data = s.loads(token_str)  # 本质上是一个解密的过程。
    except Exception as e:
        current_app.logger.info(e)
        return {'message': 'token验证失败'}
    # 如果token验证成功，还需要看看用户状态是否正常
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status!=0:#如果这个用户存在并且状态不等于0
        return {'message':'数据库中的用户状态过期'}
    return {'id':user.id}
